package com.czh.service.impl;

import cn.hutool.core.util.StrUtil;
import com.czh.convert.UserConvert;
import com.czh.dao.IUserDao;
import com.czh.dto.UserQueryDTO;
import com.czh.pojo.User;
import com.czh.service.IUserService;
import com.czh.vo.UserVO;
import org.springframework.data.domain.*;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * (User)表服务实现类
 *
 * @author makejava
 * @since 2024-07-30 15:10:52
 */
@Service("userService")
public class UserServiceImpl implements IUserService {

    /**
     * 数据库交互对象
     */
    @Resource
    private IUserDao userDao;

    /**
     * 查询单个的方法
     *
     * @param id
     * @return 单个对象
     */
    @Override
    public User queryById(Long id) {
        return this.userDao.findById(id).orElse(null);
    }

    /**
     * 查询全部的方法
     *
     * @return 全部对象的集合
     */
    @Override
    public List<User> getAll() {
        return this.userDao.findAll();

    }

    /**
     * 分页条件查询
     *
     * @param userQueryDTO
     * @return
     */
    @Override
    public Page<UserVO> pageUserByCondition(UserQueryDTO userQueryDTO) {
        // 创建分页条件
        Pageable pageable = PageRequest.of(userQueryDTO.getPage() - 1, userQueryDTO.getSize(), Sort.by(Sort.Direction.DESC, "id"));

        // 获取查询条件
        String name = userQueryDTO.getName();
        List<Long> userIds = userQueryDTO.getUserIds();
        Date time = userQueryDTO.getTime();
        Integer age = userQueryDTO.getAge();

        // 构建查询条件
        Specification<User> specification = (root, query, criteriaBuilder) -> {
            List<Predicate> predicateList = new ArrayList<>();
            if (StrUtil.isNotBlank(name)) {
                // 模糊查询
                predicateList.add(criteriaBuilder.like(root.get("name"), "%" + name + "%"));
            }
            if (userIds != null && userIds.size() > 0) {
                // 包含查询
                predicateList.add(root.get("id").in(userIds));
            }
            if (time != null) {
                // 范围查询
                predicateList.add(criteriaBuilder.between(root.get("createTime"), time, new Date()));
            }
            if (age != null) {
                // 精确查询
                predicateList.add(criteriaBuilder.equal(root.get("age"), age));
            }
            // 合并查询条件
            return criteriaBuilder.and(predicateList.toArray(new Predicate[0]));
        };
        // 使用构建的查询条件分页查询用户列表
        Page<User> all = userDao.findAll(specification, pageable);
        // 将查询结果转换为VO
        List<UserVO> userVOList = all.getContent().stream().map(user -> {
            UserVO userVO = UserConvert.INSTANCE.convertDO2VO(user);
            // 设置vo独有的值
            userVO.setIdName(getIdName(userVO.getId()));
            return userVO;
        }).collect(Collectors.toList());
        // 创建分页对象
        Page<UserVO> userVOPage = new PageImpl<>(userVOList, pageable, all.getTotalElements());
        return userVOPage;
    }

    private String getIdName(Long id) {
        if (id < 10) {
            return "小于10";
        } else {
            return "大于10";
        }
    }

    /**
     * 分页查询的方法
     *
     * @param cp 初始页
     * @param ps 页面数目
     * @return 页面对象组
     */
    @Override
    public Page<User> queryAllByLimit(int cp, int ps) {
        return this.userDao.findAll(PageRequest.of((cp - 1) * ps, ps));
    }

    /**
     * 新增的方法
     *
     * @param user 新增的对象
     * @return
     */
    @Override
    public User insert(User user) {

        return this.userDao.save(user);
    }

    /**
     * 修改的方法
     *
     * @param user 修改的对象
     * @return
     */
    @Override
    public User update(User user) {

        return this.userDao.save(user);
    }

    /**
     * 删除单个的方法
     *
     * @param id 删除的id
     * @return 布尔值
     */
    @Override
    public boolean deleteById(Long id) {

        try {
            this.userDao.deleteById(id);
        } catch (Exception ex) {
            return false;
        }
        return true;

    }
}

